package cn.springcloud.fix.demo.common;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.StringTokenizer;

public class Test {

    private static void test() throws Exception {
        //第一种方法，直接通过Person类来获取字节码
        Class cls1 = Test.class;
        //第二种方法，通过类的实例来获取Person类的字节码
        Test person = new Test();
        Class cls2 = person.getClass();
        //第三种方法，调用Class类的静态方法来获取对应类的字节码，该方法会抛出异常
        Class cls3 = Class.forName("Test");
    }

    private static void test1() throws Exception {
        Class cls = Person.class;//获取Person类的字节码

        Constructor constructor1 = cls.getConstructor();//调用getConstructor()获取Person无参构造方法
        Person p1 = (Person) constructor1.newInstance();//通过调用newInstance()来执行无参构造方法

        Constructor constructor2 = cls.getConstructor(int.class);//调用getConstructor(*.class)获取Person带参构造方法
        Person p2 = (Person) constructor2.newInstance(1);//通过调用newInstance(int)来执行带参构造方法

        Constructor[] constructors = cls.getConstructors();//调用getConstructor()获取Person无参构造方法
        for (Constructor c : constructors) {
            //Person p = c.newInstance(****);遍历执行构造方法
        }
    }

    private static void test2() throws Exception {
        Class cls = Class.forName("cn.springcloud.fix.demo.common.Person");

        Person p = new Person("小红", 20);
        Field fieldName = cls.getField("name");
        System.out.println(fieldName.get(p));

        // Field fieldAge = cls.getField("age");
        // fieldAge.setAccessible(true);//设置该私有变量可被外面访问，暴力反射
        // System.out.println(fieldAge.get(p));

        //获取setName()方法，需要传入参数为String
        Method method1 = cls.getMethod("setName", String.class);
        method1.invoke(p, "小明");//关联p,输入“小明”并执行该方法

        //获取getName()方法，无参则设为null
        Method method2 = cls.getMethod("getName", null);
        String name = (String) method2.invoke(p, null);//invoke返回的类型为Object
        System.out.println(name);

        //获取静态方法，由于静态方法只依赖与类，所以不需要提供具体的实例
        Method method3 = cls.getMethod("show", int.class);
        method3.invoke(null, 1);
    }

    private static void test3() throws Exception {
        String s = "This is a test string";
        StringTokenizer st = new StringTokenizer(s);
        System.out.println("Token Total: " + st.countTokens());
        while (st.hasMoreElements()) {
            System.out.println(st.nextToken());
        }
    }

    /**
     * String.Split() 使用正则表达式，而StringTokenizer的只是使用逐字分裂的字符。
     * 如果不用正则表达式（StringTokenizer也不能使用正则表达式），StringTokenizer在截取字符串中的效率最高。
     */
    private static void test4() {
        String str = "100|66,55:200|567,90:102|43,54";

        // StringTokenizer strToke = new StringTokenizer(str, ":,|");// 默认不打印分隔符
        // StringTokenizer strToke = new StringTokenizer(str, ":,|", true);//打印分隔符
        StringTokenizer strToke = new StringTokenizer(str, ":,|", false);//不打印分隔符
        while (strToke.hasMoreTokens()) {
            System.out.println(strToke.nextToken());
        }
    }

    public static void main(String[] args) throws Exception {
        // test1();
        // test2();
        test4();
    }
}
